﻿using System;
using System.Linq;
using System.Web.Services;
using System.Collections.Specialized;

namespace GPSTrackingWSBL
{
    /// <summary>
    /// Summary description for GPSTrackingController
    /// </summary>
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    public class GPSTrackingController : System.Web.Services.WebService
    {

        [WebMethod]
        public string wsGetImeiTrackDataLastLocationByUser(int companyID, string username, bool isUser, bool isAdmin, bool isMaster)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.TrackDataLastLocationProvider.GetImeiTrackDataLastLocationByUser(companyID, username, isUser, isAdmin, isMaster);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        [WebMethod]
        public string wsGetImeiTrackDataLastLocationByCompanyIDAndBusRouteID(int companyID, int busRouteID)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.TrackDataLastLocationProvider.GetImeiTrackDataLastLocationByCompanyIDAndBusRouteID(companyID, busRouteID);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        [WebMethod]
        public string wsGetResumenRouteHistory(int numControl)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.VPCProcessDetailsProvider.GetResumenRouteHistory(numControl).GetXml();
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        [WebMethod]
        public string wsGetGroupsTrackDataLastLocationByUser(int companyID, string username, bool isUser, bool isAdmin, bool isMaster)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.TrackDataLastLocationProvider.GetGroupsTrackDataLastLocationByUser(companyID, username,isUser, isAdmin, isMaster).GetXml();
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        [WebMethod]
        public StringCollection wsLoadRouteHistory(string imei, DateTime date, bool isFirstSelection)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.TrackDataProvider.GetAllByImeiAndDate(imei, date, isFirstSelection);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        [WebMethod]
        public StringCollection wsLoadVPCRouteHistory(int numControl, bool isFirstSelection)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.VPCProcessDetailsProvider.GetAllByNumControl(numControl, isFirstSelection);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        [WebMethod]
        public StringCollection wsLoadClientsRouteHistory(int companyID, string username, string gpsImei, DateTime date, bool isFirstSelection)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.ClientsControlProvider.GetAllTrackDataByPrimaryKey(companyID, username, gpsImei, date, isFirstSelection);
            }
            catch (Exception e)
            {
                throw e;
            }
        }
        


        [WebMethod]
        public string wsGetCompanyInfoByUser(int companyID, string username)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.CompaniesProvider.GetInfoByUser(companyID, username);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        [WebMethod]
        public string wsGetCompanyInfoByCompanyID(int companyID)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.CompaniesProvider.GetInfoByCompanyID(companyID);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        [WebMethod]
        public string wsGetCompaniesByAdminUsername(int companyID, string adminUsername, bool isMaster)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.CompaniesProvider.GetAllByAdminUsername(companyID, adminUsername, isMaster);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        [WebMethod]
        public string wsGetClientsByCompanyIDAndClientGroupID(int companyID, int clientGroupID)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.ClientsProvider.GetAllByCompanyIDAndClientGroupID(companyID, clientGroupID).GetXml();
            }
            catch (Exception e)
            {
                throw e;
            }
        }  
        
        [WebMethod]
        public string wsGetBusStopsByCompanyIDAndBusRouteID(int companyID, int busRouteID)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.BusStopProvider.GetAllByCompanyIDAndBusRouteID(companyID, busRouteID);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        [WebMethod]
        public string wsGetClientsByCompanyID(int companyID)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.ClientsProvider.GetAllByCompanyID(companyID);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        [WebMethod]
        public string wsGetClientsGroupsByCompanyID(int companyID)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.ClientsGroupsProvider.GetAllByCompanyID(companyID);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        [WebMethod]
        public string wsGetBusRoutesByCompanyID(int companyID)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.BusRoutesProvider.GetAllByCompanyID(companyID);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        [WebMethod]
        public string wsGetAllNotifications_TypeGeoFences()
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.NotificationsProvider.GetAll_TypeGeoFences();
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        [WebMethod]
        public string wsGetGeoFencesByCompanyID(int companyID)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.GeoFencesProvider.GetAllByCompanyID(companyID);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        [WebMethod]
        public string wsGetAllGPSGroupsByCompanyIDAndAdminUsername(int companyID, string username)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.GPSGroupsProvider.GetAllByCompanyIDAndAdminUsername(companyID, username);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        [WebMethod]
        public string wsGetUsersByAdminUsername(int companyID, string adminUsername)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.UsersProvider.GetByAdminUsername(companyID, adminUsername);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        [WebMethod]
        public string wsGetUsersByUserGroupID(int userGroupID)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.UsersProvider.GetByUserGroupID(userGroupID).GetXml();
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        [WebMethod]
        public string wsGetAllUsersGroupsByDepartmentID(int departmentID)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.UsersGroupsProvider.GetAllByDepartmentID(departmentID);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        [WebMethod]
        public string wsGetAllGPSStockByUsername(int companyID, string username)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.GPSStockProvider.GetAllByUsername(companyID, username);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        [WebMethod]
        public string wsGetAllDepartmentsByCompanyIDAndAdminUsername(int companyID, string adminUsername)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.DepartmentsProvider.GetAllByCompanyIDAndAdminUsername(companyID, adminUsername);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        [WebMethod]
        public string wsGetAllNotificationsByGPSImeiAndDate(string gpsImei, DateTime beginDate, DateTime endDate)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.NotificationTrackDataProvider.GetAllByGPSImeiAndDate(gpsImei, beginDate, endDate);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        [WebMethod]
        public string wsGetAllGPSStockByGPSGroupIDAndNotificationIDAndGeoFenceID(int gpsGroupID, int notificationID, int geoFenceID, string username, int companyID)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.GPSStockProvider.GetAllByGPSGroupIDAndNotificationIDAndGeoFenceID(gpsGroupID, notificationID, geoFenceID, username, companyID);
            }
            catch (Exception e)
            {
                throw e;
            }
        }
        
        [WebMethod]
        public int wsClientInsert(int companyID, int clientGroupID, string name, float latitude, float longitude, string phone1, string phone2, string typeUserTransaction, string usernameTransaction)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.ClientsProvider.Insert(companyID, clientGroupID, name, latitude, longitude, phone1, phone2, typeUserTransaction, usernameTransaction);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        [WebMethod]
        public int wsBusStopInsert(int companyID, int busRouteID, string name, float latitude, float longitude, bool isTerminal, bool isHalfTerminal)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.BusStopProvider.Insert(companyID, busRouteID, name, latitude, longitude, isTerminal, isHalfTerminal);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        [WebMethod]
        public bool wsClientDelete(int clientGroupID, int clientID)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.ClientsProvider.Delete(clientGroupID, clientID);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        [WebMethod]
        public bool wsBusStopDelete(int busRouteID, int busStopID)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.BusStopProvider.Delete(busRouteID, busStopID);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        [WebMethod]
        public bool wsBusRouteDelete(int companyID, int busRouteID)
        {
            GPSTrackingDBV2.Data.TransactionManager tm = GPSTrackingDBV2.Data.DataRepository.Provider.CreateTransaction();
            bool deleteSucessfull = false;
            try
            {
                tm.BeginTransaction();
                deleteSucessfull = GPSTrackingDBV2Custom.Data.DataRepository.BusRoutesProvider.Delete(companyID, busRouteID);
                tm.Commit();
                return deleteSucessfull;
            }
            catch (Exception e)
            {
                tm.Rollback();
                throw e;
            }
        }

        [WebMethod]
        public string wsGetAllBusRouteDetailsByBusRouteID(int busRouteID)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.BusRoutesDetailsProvider.GetAllByBusRouteID(busRouteID);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        [WebMethod]
        public int wsBusRoutesDetailsInsert(int companyID, string name, StringCollection latitudeList, StringCollection longitudeList)
        {
            GPSTrackingDBV2.Data.TransactionManager tm = GPSTrackingDBV2.Data.DataRepository.Provider.CreateTransaction();
            int pos;
            float latitude;
            float longitude;

            int busRouteID = -1;

            try
            {
                tm.BeginTransaction();
                busRouteID = GPSTrackingDBV2Custom.Data.DataRepository.BusRoutesProvider.Insert(companyID, name);

                if (busRouteID == -1) {
                    return busRouteID;
                }

                for (int i = 0; i < latitudeList.Count; i++)
                {

                    pos = i + 1;
                    latitude = float.Parse(latitudeList[i].ToString());
                    longitude = float.Parse(longitudeList[i].ToString());

                    GPSTrackingDBV2Custom.Data.DataRepository.BusRoutesDetailsProvider.Insert(busRouteID, pos, latitude, longitude);
                }

                tm.Commit();
                return busRouteID;
            }
            catch (Exception e)
            {
                tm.Rollback();
                throw e;
            }
        }

        [WebMethod]
        public void wsBusRoutesDetailsUpdate(int busRouteID, StringCollection latitudeList, StringCollection longitudeList)
        {
            GPSTrackingDBV2.Data.TransactionManager tm = GPSTrackingDBV2.Data.DataRepository.Provider.CreateTransaction();
            int pos;
            float latitude;
            float longitude;

            try
            {
                tm.BeginTransaction();
                GPSTrackingDBV2Custom.Data.DataRepository.BusRoutesDetailsProvider.DeleteAllByBusRouteID(busRouteID);

                for (int i = 0; i < latitudeList.Count; i++)
                {

                    pos = i + 1;
                    latitude = float.Parse(latitudeList[i].ToString());
                    longitude = float.Parse(longitudeList[i].ToString());

                    GPSTrackingDBV2Custom.Data.DataRepository.BusRoutesDetailsProvider.Insert(busRouteID, pos, latitude, longitude);
                }

                tm.Commit();
            }
            catch (Exception e)
            {
                tm.Rollback();
                throw e;
            }
        }

        [WebMethod]
        public bool wsNotificationsInsert_Delete_Update_TypeGeoFences(int geoFenceID, bool notyGeoFenceToSendAdmin, bool isUpdateNotyGeoFenceToSendAdmin, bool notyGPSImeiToSendUser, bool isUpdatGPSImeiToSendUser, int notificationID, StringCollection gpsImeiToInsert, StringCollection gpsImeiToDelete, string username, int companyID)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.NotificationsProvider.Insert_Delete_Update_TypeGeoFences(geoFenceID, notyGeoFenceToSendAdmin, isUpdateNotyGeoFenceToSendAdmin, notyGPSImeiToSendUser, isUpdatGPSImeiToSendUser, notificationID, gpsImeiToInsert, gpsImeiToDelete, username, companyID);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        [WebMethod]
        public bool wsGeoFenceDelete(int companyID, int geoFenceID)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.GeoFencesProvider.Delete(companyID, geoFenceID);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        [WebMethod]
        public string wsGeoFenceInsert(int companyID, string name, StringCollection latitudePolygonoList, StringCollection longitudePolygonoList)
        {
            float latitude;
            float longitude;
            int geoFenceID = -1;

            GPSTrackingDBV2.Entities.TList<GPSTrackingDBV2.Entities.GeoFenceDetails> geoFenceDetailsList = new GPSTrackingDBV2.Entities.TList<GPSTrackingDBV2.Entities.GeoFenceDetails>();
            
            GPSTrackingDBV2.Entities.GeoFenceDetails geoFenceDetailsEntity;

            GPSTrackingDBV2.Data.TransactionManager tm = GPSTrackingDBV2.Data.DataRepository.Provider.CreateTransaction();

            try
            {
                tm.BeginTransaction();

                geoFenceID = GPSTrackingDBV2Custom.Data.DataRepository.GeoFencesProvider.Insert(companyID, name);
                if(geoFenceID == -1){
                    return "-1";
                }
                
                for (int i = 0; i < latitudePolygonoList.Count && i < longitudePolygonoList.Count; i++)
                {
                    geoFenceDetailsEntity = new  GPSTrackingDBV2.Entities.GeoFenceDetails();

                    latitude = float.Parse(latitudePolygonoList[i]);
                    longitude = float.Parse(longitudePolygonoList[i]);

                    geoFenceDetailsEntity.GeoFenceId = geoFenceID;
                    geoFenceDetailsEntity.NumPos = i + 1;
                    geoFenceDetailsEntity.Latitude = latitude;
                    geoFenceDetailsEntity.Longitude = longitude;

                    geoFenceDetailsList.Add(geoFenceDetailsEntity);
                }

                GPSTrackingDBV2.Data.DataRepository.GeoFenceDetailsProvider.Insert(geoFenceDetailsList);

                GPSTrackingDBV2Custom.Data.DataRepository.GeoFencesProvider.SetPolygonByGeoFenceID(geoFenceID);

                tm.Commit();

                return GPSTrackingDBV2Custom.Data.DataRepository.GeoFencesProvider.GetByGeoFenceID(geoFenceID);
            }
            catch (Exception e)
            {
                tm.Rollback();
                throw e;
            }
        }

        [WebMethod]
        public string wsUpdateGeoFenceByGeoFenceID(string username, int geoFenceID, string description, string imei, StringCollection latitudePolygonoList, StringCollection longitudePolygonoList)
        {

            /*float latitude;
            float longitude;
            GPSTrackingServerDB.Data.TransactionManager tm = GPSTrackingServerDB.Data.DataRepository.Provider.CreateTransaction();
            GPSTrackingServerDB.Entities.TList<GPSTrackingServerDB.Entities.GeoFenceDetails> geoFenceDetailsEntityList;
            GPSTrackingServerDB.Entities.GeoFenceDetails geoFenceDetailsEntity;
            GPSTrackingServerDB.Entities.GeoFence geoFenceEntity;

            try
            {
                tm.BeginTransaction();

                geoFenceEntity = new GPSTrackingServerDB.Entities.GeoFence();

                geoFenceEntity.GeoFenceId = geoFenceID;
                geoFenceEntity.Description = description;

                if (description != "")
                {
                    if (GPSTrackingServerDBCustom.Data.DataRepository.GeoFenceByImeiProvider.ExistGeoFenceByImeiAndDescription(imei, description))
                        throw new Exception("El nombre definido para el Polígono ya esta registrado para este vehículo, debe cambiar el nombre del Polígono o dejar el nombre en blanco para poder actualizar el polígono.");

                    GPSTrackingServerDB.Data.DataRepository.GeoFenceProvider.Update(tm, geoFenceEntity);
                }

                geoFenceDetailsEntityList = new GPSTrackingServerDB.Entities.TList<GPSTrackingServerDB.Entities.GeoFenceDetails>();

                geoFenceDetailsEntityList = GPSTrackingServerDB.Data.DataRepository.GeoFenceDetailsProvider.GetByGeoFenceId(tm, geoFenceID);

                GPSTrackingServerDB.Data.DataRepository.GeoFenceDetailsProvider.Delete(tm, geoFenceDetailsEntityList);

                geoFenceDetailsEntityList.Clear();

                for (int i = 0; i < latitudePolygonoList.Count && i < longitudePolygonoList.Count; i++)
                {
                    geoFenceDetailsEntity = new GPSTrackingServerDB.Entities.GeoFenceDetails();

                    latitude = float.Parse(latitudePolygonoList[i]);
                    longitude = float.Parse(longitudePolygonoList[i]);

                    geoFenceDetailsEntity.GeoFenceId = geoFenceID;
                    geoFenceDetailsEntity.NumPos = i + 1;
                    geoFenceDetailsEntity.Latitude = latitude;
                    geoFenceDetailsEntity.Longitude = longitude;

                    geoFenceDetailsEntityList.Add(geoFenceDetailsEntity);
                }

                GPSTrackingServerDB.Data.DataRepository.GeoFenceDetailsProvider.Insert(tm, geoFenceDetailsEntityList);
                tm.Commit();

                return GPSTrackingServerDBCustom.Data.DataRepository.GeoFenceDetailsProvider.GetGeoFenceDetailsByGeoFenceID(geoFenceID);
            }
            catch (Exception e)
            {
                tm.Rollback();
                throw e;
            }*/
            return "";
        }

        [WebMethod]
        public void wsClientsToVisitInsert(int companyID, string username, string gpsImei, StringCollection dateList, string timeBegin, string timeEnd, int clientGroupID, StringCollection clientIDList, StringCollection numPosList, StringCollection distanceList, StringCollection durationList, float latitudeOrigin, float longitudeOrigin)
        {
            GPSTrackingDBV2.Data.TransactionManager tm = GPSTrackingDBV2.Data.DataRepository.Provider.CreateTransaction();
            int clientID;
            int numPos;
            DateTime date;
            DateTime dateTimeBegin;
            DateTime dateTimeEnd;
            int distanceMts;
            int durationSeg;
            
            int lastClientId;
            DateTime leftDateTime;
            DateTime arriveDateTime;
            DateTime dateTimeBeginClient;
            DateTime dateTimeEndClient;

            int averageOnMinutesToVisitClients;

            try
            {
                tm.BeginTransaction();

                averageOnMinutesToVisitClients = 30;

                for (int j = 0; j < dateList.Count; j++)
                {
                    date = DateTime.Parse(dateList[j]);
                    dateTimeBegin = DateTime.Parse(dateList[j] + " " + timeBegin);
                    dateTimeEnd = DateTime.Parse(dateList[j] + " " + timeEnd);

                    GPSTrackingDBV2Custom.Data.DataRepository.ClientsToVisitProvider.Delete(companyID, tm, username, gpsImei, date);

                    lastClientId = -1;
                    leftDateTime = dateTimeBegin;

                    for (int i = 0; i < clientIDList.Count; i++)
                    {
                        clientID = int.Parse(clientIDList[i]);
                        numPos = int.Parse(numPosList[i]);
                        distanceMts = int.Parse(distanceList[i]);
                        durationSeg = int.Parse(durationList[i]);

                        arriveDateTime = leftDateTime.AddSeconds(durationSeg);
	                    dateTimeBeginClient = arriveDateTime;
                        dateTimeEndClient = dateTimeBeginClient.AddMinutes(averageOnMinutesToVisitClients);
                        

                        GPSTrackingDBV2Custom.Data.DataRepository.ClientsToVisitProvider.Insert(companyID, tm, username, gpsImei, date, dateTimeBegin, dateTimeEnd, clientGroupID, clientID, numPos, distanceMts, latitudeOrigin, longitudeOrigin, lastClientId, leftDateTime, arriveDateTime, dateTimeBeginClient, dateTimeEndClient);
                        
                        lastClientId = clientID;
                        leftDateTime = dateTimeEndClient;
                    }

                }

                tm.Commit();
            }
            catch (Exception e)
            {
                tm.Rollback();
                throw e;
            }
        }

        [WebMethod]
        public void wsClientsToVisitDelete(int companyID, string username, string gpsImei, DateTime date)
        {
            try
            {
                GPSTrackingDBV2.Data.TransactionManager tm = GPSTrackingDBV2.Data.DataRepository.Provider.CreateTransaction();
                GPSTrackingDBV2Custom.Data.DataRepository.ClientsToVisitProvider.Delete(companyID, tm, username, gpsImei, date);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        [WebMethod]
        public string wsGetClientsToVisitByUsernameByGPSImeiByDate(int companyID, string username, string gpsImei, DateTime date)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.ClientsToVisitProvider.GetByUsernameByGPSImeiByDate(companyID, username, gpsImei, date).GetXml();
            }
            catch (Exception e)
            {
                throw e;
            }
        }
        
        [WebMethod]
        public string wsGetVPCProcessByDatesByCompanyID(DateTime dateBegin, int companyID)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.VPCProcessProvider.GetByDatesByCompanyID(dateBegin, dateBegin, companyID).GetXml();
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        [WebMethod]
        public string wsGetClientsProcessByDatesByCompanyID(DateTime dateBegin, int companyID)
        {
            try
            {
                return GPSTrackingDBV2Custom.Data.DataRepository.ClientsControlProvider.GetByDatesByCompanyID(dateBegin, dateBegin, companyID).GetXml();
            }
            catch (Exception e)
            {
                throw e;
            }
        }
    }
}
